#pragma once

#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QOpenGLShaderProgram>
#include <QOpenGLBuffer>
#include <QOpenGLVertexArrayObject>
#include <QElapsedTimer>

/**
 * @brief CocosWidget - Qt原生OpenGL渲染组件
 *
 * 继承QOpenGLWidget，使用Qt原生OpenGL能力进行渲染。
 * 负责：
 * - OpenGL上下文管理
 * - 三角形渲染（使用Shader）
 * - 文字渲染（使用QPainter）
 * - 渲染循环控制
 */
class CocosWidget : public QOpenGLWidget, protected QOpenGLFunctions {
    Q_OBJECT

public:
    explicit CocosWidget(QWidget* parent = nullptr);
    ~CocosWidget() override;

    /**
     * @brief 获取当前帧率
     * @return FPS值
     */
    float getFrameRate() const;

signals:
    /**
     * @brief 帧率变化信号（用于更新UI显示）
     * @param fps 当前帧率
     */
    void fpsChanged(float fps);

    /**
     * @brief 鼠标点击信号
     * @param x 鼠标X坐标
     * @param y 鼠标Y坐标
     */
    void cardClicked(float x, float y);

protected:
    // =========================================================================
    // QOpenGLWidget虚函数重写
    // =========================================================================

    /**
     * @brief 初始化OpenGL（只调用一次）
     */
    void initializeGL() override;

    /**
     * @brief 窗口大小变化处理
     */
    void resizeGL(int w, int h) override;

    /**
     * @brief 渲染函数（每帧调用）
     */
    void paintGL() override;

    // =========================================================================
    // Qt事件处理
    // =========================================================================

    void mousePressEvent(QMouseEvent* event) override;
    void mouseReleaseEvent(QMouseEvent* event) override;
    void mouseMoveEvent(QMouseEvent* event) override;

private:
    /**
     * @brief 初始化OpenGL着色器
     */
    void initializeShaders();

    /**
     * @brief 初始化三角形几何数据
     */
    void initializeTriangle();

    /**
     * @brief 渲染三角形
     */
    void renderTriangle();

    /**
     * @brief 渲染文字
     */
    void renderText();

    /**
     * @brief 清理OpenGL资源
     */
    void cleanup();

private:
    // OpenGL资源
    QOpenGLShaderProgram* m_shaderProgram;     ///< 着色器程序
    QOpenGLBuffer* m_vertexBuffer;             ///< 顶点缓冲对象
    QOpenGLVertexArrayObject* m_vao;           ///< 顶点数组对象

    // 渲染状态
    QElapsedTimer m_timer;                     ///< 计时器（用于计算帧时间）
    float m_lastFrameTime;                     ///< 上一帧时间（秒）
    bool m_initialized;                        ///< 是否已初始化
    int m_frameCount;                          ///< 帧计数（用于FPS统计）
    float m_fpsUpdateTimer;                    ///< FPS更新计时器
    float m_currentFPS;                        ///< 当前FPS

    // 动画参数
    float m_rotation;                          ///< 三角形旋转角度
};
